namespace CSharpPro._1016;

public class User
{
    private Dictionary<string, string> _userData = new Dictionary<string, string>();
    
    public void MainMenu()
    {
        bool isRunning = true;
        
        while (isRunning)
        {
            Console.WriteLine("\n===== 用户系统 =====");
            Console.WriteLine("1. 登录");
            Console.WriteLine("2. 注册");
            Console.WriteLine("3. 退出");
            Console.Write("请选择功能 (1-3): ");
            
            string choice = Console.ReadLine()?.Trim();
            
            switch (choice)
            {
                case "1":
                    Login();
                    break;
                case "2":
                    Register();
                    break;
                case "3":
                    Console.WriteLine("系统已退出，再见！");
                    isRunning = false;
                    break;
                default:
                    Console.WriteLine("输入无效，请输入1-3之间的数字！");
                    break;
            }
        }
    }

    // 用户注册功能
    private void Register()
    {
        Console.WriteLine("\n===== 用户注册 =====");
        
        // 获取并验证用户名
        Console.Write("请输入用户名: ");
        string username = Console.ReadLine()?.Trim();
        
        if (string.IsNullOrWhiteSpace(username))
        {
            Console.WriteLine("错误：用户名不可为空！");
            return;
        }
        
        if (!IsValidUsername(username))
        {
            Console.WriteLine("错误：用户名格式不正确！");
            Console.WriteLine("用户名要求：3-15个字符，只能包含字母、数字和下划线(_)");
            return;
        }
        
        if (_userData.ContainsKey(username))
        {
            Console.WriteLine("错误：该用户名已被注册！");
            return;
        }
        
        // 获取并验证密码
        Console.Write("请输入密码: ");
        string password = Console.ReadLine()?.Trim();
        
        Console.Write("请确认密码: ");
        string confirmPassword = Console.ReadLine()?.Trim();
        
        if (string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(confirmPassword))
        {
            Console.WriteLine("错误：密码不可为空！");
            return;
        }
        
        if (!IsValidPassword(password))
        {
            Console.WriteLine("错误：密码格式不正确！");
            Console.WriteLine("密码要求：6-20个字符，必须包含至少1个大写字母、1个小写字母和1个数字");
            return;
        }
        
        if (password != confirmPassword)
        {
            Console.WriteLine("错误：两次输入的密码不一致！");
            return;
        }
        
        // 注册成功
        _userData.Add(username, password);
        Console.WriteLine("注册成功！已返回主菜单。");
    }

    // 用户登录功能
    private void Login()
    {
        Console.WriteLine("\n===== 用户登录 =====");
        
        Console.Write("请输入用户名: ");
        string username = Console.ReadLine()?.Trim();
        
        Console.Write("请输入密码: ");
        string password = Console.ReadLine()?.Trim();
        
        if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("错误：用户名或密码不可为空！");
            return;
        }
        
        if (!_userData.ContainsKey(username))
        {
            Console.WriteLine("登录失败：用户名不存在！");
            return;
        }
        
        if (_userData[username] != password)
        {
            Console.WriteLine("登录失败：密码错误！");
            return;
        }
        
        // 登录成功
        Console.WriteLine($"\n欢迎回来，{username}！登录成功！");
        Console.WriteLine("已进入系统首页...");
    }

    // 验证用户名格式
    private bool IsValidUsername(string username)
    {
        // 检查长度
        if (username.Length < 3 || username.Length > 15)
            return false;
            
        // 检查字符是否合法
        foreach (char c in username)
        {
            if (!char.IsLetterOrDigit(c) && c != '_')
                return false;
        }
        
        return true;
    }

    // 验证密码格式
    private bool IsValidPassword(string password)
    {
        // 检查长度
        if (password.Length < 6 || password.Length > 20)
            return false;
            
        bool hasUpper = false;
        bool hasLower = false;
        bool hasDigit = false;
        
        // 检查是否包含大写字母、小写字母和数字
        foreach (char c in password)
        {
            if (char.IsUpper(c)) hasUpper = true;
            if (char.IsLower(c)) hasLower = true;
            if (char.IsDigit(c)) hasDigit = true;
        }
        
        return hasUpper && hasLower && hasDigit;
    }
}